/** Base Class for stimuli, sets common calling interface.

    DCN 27-06-2010
*/

#pragma once

// include some headers (almost) any stimulus will all need
#include <vector>
#include <string>
#include <Matrices.h>       // includes Matrix.h
#ifndef __GLEW_H__
    #include <GL/glew.h>
    #include <GL/wglew.h>
#endif

namespace Stims // Avoid pollution
{
    // Stimulus type enumerator
    enum StimType {Ground, GroundCeiling, Cloud, Target};
}

class CStimBase
{
public:
    CStimBase(const enum Stims::StimType& eStimType_)
        : _eStimType(eStimType_) {};
    virtual ~CStimBase(void)
        {};

    // prepare stimulus
    virtual void Reset          () = 0;

    // change stimulus
    virtual void Update         (const CMatrix<double>& mEyePos_, const double& dYaw_) = 0;
    virtual void Update         (const std::vector<double>& vEyePos_, const double& dYaw_);
    virtual void Update         (const double& dX_, const double& dY_, const double& dZ_, const double& dYaw_);
    virtual void Draw           () = 0;

    // other
    virtual std::string GetName () = 0;

protected:
    // world specification
    const enum Stims::StimType _eStimType;
};